#include "Function.h"
#include "exprtk.hpp"  // ExprTk 头文件
#include <cmath>

// 解析字符串表达式并返回函数对象（1D）
std::function<double(double)> parseExpression_1D(const std::string& exprStr) {
    return [exprStr](double x) {
        double pi = M_PI;
        // 创建符号表并添加变量
        exprtk::symbol_table<double> symbolTable;
        symbolTable.add_variable("x", x);
        symbolTable.add_constant("pi", pi);

        // 创建表达式对象
        exprtk::expression<double> expression;
        expression.register_symbol_table(symbolTable);

        // 解析表达式
        exprtk::parser<double> parser;
        if (!parser.compile(exprStr, expression)) {
            throw std::runtime_error("Failed to parse expression: " + exprStr);
        }

        // 返回计算结果
        return expression.value();
    };
}

// 解析字符串表达式并返回函数对象（2D）
std::function<double(double, double)> parseExpression_2D(const std::string& exprStr) {
    return [exprStr](double x, double y) {
        double pi = M_PI;
        // 创建符号表并添加变量
        exprtk::symbol_table<double> symbolTable;
        symbolTable.add_variable("x", x);
        symbolTable.add_variable("y", y);
        symbolTable.add_constant("pi", pi);

        // 创建表达式对象
        exprtk::expression<double> expression;
        expression.register_symbol_table(symbolTable);

        // 解析表达式
        exprtk::parser<double> parser;
        if (!parser.compile(exprStr, expression)) {
            throw std::runtime_error("Failed to parse expression: " + exprStr);
        }

        // 返回计算结果
        return expression.value();
    };
}
